package com.macro.mall.tiny.modules.foster.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.macro.mall.tiny.modules.foster.mapper.*;
import com.macro.mall.tiny.modules.foster.model.*;
import com.macro.mall.tiny.modules.foster.model.dto.ItemDTO;
import com.macro.mall.tiny.modules.foster.model.dto.PetAndTimeDTO;
import com.macro.mall.tiny.modules.foster.service.AlipayOrderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * <p>
 * 支付宝支付订单表 服务实现类
 * </p>
 *
 * @author zhuyi
 * @since 2024-04-02
 */
@Service
public class AlipayOrderServiceImpl extends ServiceImpl<AlipayOrderMapper, AlipayOrder> implements AlipayOrderService {
    private static final Logger LOGGER = LoggerFactory.getLogger(AlipayOrderServiceImpl.class);
    @Autowired
    private AlipayOrderMapper alipayOrderMapper;
    @Autowired
    private ItemMapper itemMapper;
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RoomMapper roomMapper;
    @Autowired
    private PetMapper petMapper;

    /**
     * 创建寄养宠物预定订单
     *
     * @param timeDTO 包含宠物寄养开始时间和结束时间，以及房间ID的DTO对象
     * @return 返回创建的支付宝订单对象，如果开始时间晚于结束时间则返回null
     */
    @Override
    public AlipayOrder createAppointOrder(PetAndTimeDTO timeDTO) {
        try {
            // 检查结束时间是否早于开始时间，若是，则返回null
            if (timeDTO.getEndTime().before(timeDTO.getStartTime())) {
                return null;
            }
            // 生成订单ID
            String orderId = new SimpleDateFormat("yyyyMMdd").format(new Date()) + System.currentTimeMillis();
            AlipayOrder alipayOrder = new AlipayOrder();
            alipayOrder.setOrderId(orderId);

            // 计算订单总价
            long startTime = timeDTO.getStartTime().getTime();
            long endTime = timeDTO.getEndTime().getTime();
            long dayNum = (endTime - startTime) / 24 / 60 / 60 / 1000; // 计算寄养天数
            BigDecimal price = new BigDecimal(100); // 单日寄养价格
            // 根据房间ID查询房间信息
            Room room = roomMapper.selectById(timeDTO.getRoomId());
            // 根据用户ID查询用户信息
            User user = userMapper.selectById(timeDTO.getPet().getUserId());
            // 设置订单主题
            alipayOrder.setSubject(user.getUsername() + "用户的宠物" + timeDTO.getPet().getName() + "在房间" + room.getName() + "寄养" + dayNum + "天");
            // 设置订单总金额
            alipayOrder.setTotalAmount(price.multiply(new BigDecimal(dayNum)));
            setOrderDate(alipayOrder); // 设置订单日期
            //设置购买人
            alipayOrder.setBuyerId(String.valueOf(timeDTO.getPet().getUserId()));
            //设置订单类型
            alipayOrder.setType(0);
            alipayOrder.setTradeStatus(0);
            alipayOrderMapper.insert(alipayOrder); // 插入订单到数据库
            return alipayOrder;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 创建商品订单
     *
     * @param itemDTO 商品订单详情数据传输对象，包含商品ID、用户ID、宠物ID、购买数量
     * @return 返回创建的支付宝订单对象，如果创建失败或库存不足返回null
     */
    @Override
    public AlipayOrder createItemOrder(ItemDTO itemDTO) {
        try {
            // 生成订单号
            String orderId = new SimpleDateFormat("yyyyMMdd").format(new Date()) + System.currentTimeMillis();
            AlipayOrder alipayOrder = new AlipayOrder();
            alipayOrder.setOrderId(orderId);

            // 查询商品信息，并检查库存是否满足购买数量
            Item item = itemMapper.selectById(itemDTO.getItemId());
            if (item.getInventory() - itemDTO.getNum() < 0 || item.getInventory() - itemDTO.getNum() == 0) {
                return null;
            }

            // 计算订单总金额
            BigDecimal price = new BigDecimal(item.getPrice());
            User user = userMapper.selectById(itemDTO.getUserId());
            Pet pet = petMapper.selectById(itemDTO.getPetId());
            // 设置订单标题
            alipayOrder.setSubject(user.getUsername() + "用户为宠物" + pet.getName() + "购买了" + item.getName() + "商品" + itemDTO.getNum() + "件");
            alipayOrder.setTotalAmount(price.multiply(new BigDecimal(itemDTO.getNum())));

            // 设置订单日期
            setOrderDate(alipayOrder);
            //设置购买人
            alipayOrder.setBuyerId(String.valueOf(itemDTO.getUserId()));
            //设置订单类型
            alipayOrder.setType(1);
            alipayOrder.setTradeStatus(0);
            // 插入订单到数据库
            alipayOrderMapper.insert(alipayOrder);

            // 更新商品库存
            item.setInventory(item.getInventory() - itemDTO.getNum());
            itemMapper.updateById(item);

            return alipayOrder;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 分页查询支付宝订单信息。
     *
     * @param page   分页参数，包含当前页码和每页显示的数量。
     * @param type   订单类型，可选参数，用于筛选特定类型的订单。
     * @param userId 用户ID，可选参数，用于筛选特定用户的订单。
     * @return 返回分页查询结果，包含当前页的订单列表和分页信息。
     */
    @Override
    public Page<AlipayOrder> pageItem(Page<AlipayOrder> page, Integer type, Long userId) {
        try {
            // 构建查询条件，支持根据类型和用户ID进行过滤
            LambdaQueryWrapper<AlipayOrder> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper
                    .eq(type != null, AlipayOrder::getType, type)
                    .eq(userId != null, AlipayOrder::getBuyerId, userId)
                    .orderByDesc(AlipayOrder::getGmtPayment);
            // 执行分页查询
            Page<AlipayOrder> orderPage = alipayOrderMapper.selectPage(page, queryWrapper);
            return orderPage;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 设置订单的支付日期和时间。
     * 该方法将当前日期和时间格式化为指定的字符串格式，然后将其设置为支付宝订单的支付时间（gmt_payment）。
     *
     * @param alipayOrder 阿里巴巴支付订单对象，其支付时间将被设置。
     */
    private static void setOrderDate(AlipayOrder alipayOrder) {
        // 创建一个SimpleDateFormat实例，用于格式化日期和时间
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
        // 获取当前的日期和时间
        Calendar calendar = Calendar.getInstance();
        Date currentDate = calendar.getTime();
        // 将当前日期和时间设置到支付宝订单对象的支付时间字段
        alipayOrder.setGmtPayment(currentDate);
    }


}
